/**
 * 
 */
package services.communication.mail;

import java.rmi.RemoteException;
import java.util.List;

import org.example.www.communication.MailService.CommunicationMailService_PortType;
import org.example.www.communication.MailService.EMail;

import services.communication.mail._dynamic.CommunicationMailServiceIF;

/**
 * Interfaz que abstrae el comportamiento comun de un cliente de mail simple.<BR/>
 * Define matodos basicos para iniciar el cliente con un nombre de usuario
 * enviar e-mails, llevar cuenta de la cantidad de mails enviados durante la
 * vida de cada instancia, recibir los e-mails del usuario, ordenarlos por
 * remitente.<BR/>
 * Dea acuerdo al archivo que se utilice para instanciar mediante Spring, se
 * utilizara un proxy dinamico
 * (services.communication.mail._dynamic.communicationMailService.xml) o un
 * proxy hibrido
 * (services.communication.mail._hhybrid.communicationMailService.xml).
 * 
 * @author lito
 */
public interface SimpleMailClientIF {
	/**
	 * Mensaje de error uilizado en la excepcion arrojada por el metodo
	 * {@link #reciveEMails()}.
	 */
	public static final String	ERROR_MSG_RECIVE_EMAILS	= "Ocurrio una excepcion remota al intentar obtener los e-mails";
	
	/**
	 * Mensaje de error uilizado en la excepcion arrojada por el metodo
	 * {@link #reciveEMails()}.
	 */
	public static final String	ERROR_MSG_SEND_EMAIL	= "Ocurrio un error al enviar el e-mail.";
	
	/**
	 * @return El identificador del cliente. E-mail del usuario.
	 */
	public String getClientID();
	
	/**
	 * vuelve la cuenta de mails enviados a cero. limpia la lista de mails
	 * recividos.
	 * 
	 * @param clientID
	 *        El identificador del cliente. E-mail del usuario.
	 */
	public void setClientID(String clientID);
	
	/**
	 * @return Cantidad de e-amils enviados por la instancia.
	 */
	public int getSendMailcount();
	
	/**
	 * @return Lista de los EMails recividos en la ultima llamada al metodo
	 *         {@link #reciveEMails()}.
	 */
	public List<EMail> getRecivedMails();
	
	/**
	 * @return Proxy para acceder al web-service de e-mail via spring.
	 */
	public CommunicationMailServiceIF getSpringMailServiceProxy();
	
	/**
	 * @param springMailServiceProxy
	 *        Proxy para acceder al web-service de e-mail via spring.
	 */
	public void setSpringMailServiceProxy(
			CommunicationMailServiceIF springMailServiceProxy);
	
	/**
	 * @return Proxy para acceder al web-service de e-mail.
	 */
	public CommunicationMailService_PortType getMailServiceProxy();
	
	/**
	 * @param setMailServiceProxy
	 *        Proxy para acceder al web-service de e-mail.
	 */
	public void setMailServiceProxy(
			CommunicationMailService_PortType mailServiceProxy);
	
	/**
	 * Invoca el metodo
	 * {@link CommunicationMailService_PortType#reciveEMails(String)} de la
	 * instancia interna {@link SimpleMailClient#springProxy} para obtener los
	 * e-mails del cliente que tenga seteada esta instancia.<BR/>
	 * Luego construye una lista a partir del arreglo de EMails seteando
	 * {@link #recivedMails}.<BR/>
	 * 
	 * @throws RuntimeException
	 *         En caso de que ocurra una {@link RemoteException}.
	 */
	public void reciveEMails();
	
	/**
	 * Envia el e-mail pasado como parametro mediante el proxy interno.
	 * Incrementa en uno la cuenta de e-mails de la instancia.
	 * 
	 * @param email
	 *        El e-mail a enviar.
	 * @throws Exception
	 *         En caso de que ocurra una {@link RemoteException}.<BR/>
	 *         O en caso de que el metodo
	 *         {@link CommunicationMailService_PortType#sendEMail(EMail)}
	 *         retorne false.
	 */
	public void sendEMail(EMail email) throws Exception;
	
	/**
	 * Retorna una lista con los e-mails que se hayan recivido en el ultimo
	 * llamado del metodo {@link #reciveEMails()}.<BR/>
	 * Este metodo no afecta la lista que se devuelve con el metodo
	 * {@link #getRecivedMails()}.
	 * 
	 * @return Una lista con los e-mails que se hayan recivido en el ultimo
	 *         llamado del metodo {@link #reciveEMails()}.
	 */
	public List<EMail> getRecivedEMailsOrderBySender();
}
